// 对象的可扩展性(extension)

let x = {
    id: 1001,
    name: '阿芳',
    gender: '靓妹'
}

// Object.isExtensible(object)
// 作用: 判断指定对象(object)是否可以扩展
// 返回: 仅当指定的对象可以扩展时返回true
let ext = Object.isExtensible( x );
console.log( ext );

// 动态添加属性
x.age = 20;
// 通过defineProperty定义属性
Object.defineProperty(x, 'hometown' , { value: '兰州', enumerable: true, writable: true } );

console.log( x );

// 动态删除属性
delete x.id;
console.log( x );

x.name = '小芳';
x.hometown = '中国兰州';
console.log( x );

// Object.preventExtensions( object )
// 作用: 阻止指定对象(object)的扩展操作(即禁用某个对象的扩展性)
// 返回: 返回禁用扩展性后的对象(即参数传入的对象)
let y = Object.preventExtensions( x );
console.log( y == x ); // true


// 尝试在为已阻止扩展的对象动态添加属性
x.school = '陇北大学'; // 没有抛出异常但添加失败
console.log( x );

// TypeError: Cannot define property room, object is not extensible
// Object.defineProperty(x , 'room', { value: 1025 } ); // 执行失败抛出异常


// 禁用对象的扩展性后，仍然可以修改属性值
x.gender = '女';
console.log( x );

// 禁用对象的扩展性后，仍然可以配置属性(比如删除属性)
delete x.age;
console.log( x );

console.log( Object.getOwnPropertyDescriptor(x, 'name' ) );
// 禁用对象的扩展性后，仍然可以配置属性(比如修改属性的描述符)
Object.defineProperty(x, 'name', { writable: false, configurable: false, enumerable: true } );
console.log( Object.getOwnPropertyDescriptor(x, 'name' ) );
